//
//  YJStatusViewModel.swift
//  YJWeiBo
//
//  Created by Jim1024 on 2017/1/19.
//  Copyright © 2017年 Jim1024. All rights reserved.
//

import UIKit
import Kingfisher

class YJStatusViewModel: NSObject {
    /// 单例
    static let share: YJStatusViewModel = YJStatusViewModel()
    
    /// 是否在加载微博数据
    fileprivate var loading: Bool = false
    
    /**
     加载微博数据
     调用网络请求 API地址: https://api.weibo.com/2/statuses/friends_timeline.json
     
     - parameter since_id:           若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
     - parameter max_id:             若指定此参数，则返回ID小于或等于max_id的微博，默认为0。
     - parameter loadStatusCallback: 获取到微博数据后的回调
     */
    func loadStatus(_ since_id: Int64, max_id: Int64, callback: @escaping (_ statuses: [YJStatus]?, _ error: NSError?) -> ()) -> () {
        if loading {
            JPrint("正在加载微博数据...")
            callback(nil, YJNetworkManagerError.repeatRefresh.error())
            return
        }
        
        loading = true
        
        YJStatusDAL.shared.dalLoadStatus(since_id, max_id: max_id) { (status, error) in
            self.loading = false
            if error != nil {
                JPrint("加载微博数据出错了: \(error)")
                callback(nil, error)
                return
            }
            
            var statuses = [YJStatus]()
            for dict in status! {
                let status = YJStatus(dict: dict)
                statuses.append(status)
            }
            // 当字典转模型完成后,来缓存微博模型里面的图片,当微博里面的图片缓存完成了,才通知控制器来显示微博数据
            self.cacheWebImage(statuses, completion: callback)
        }
    }
    
    /// 缓存微博图片
    fileprivate func cacheWebImage(_ statuses: [YJStatus], completion: @escaping (_ statuses: [YJStatus]?, _ error: NSError?) -> ()) {
        // 创建group
        let group = DispatchGroup()
        var length: CGFloat = 0
        
        // 查找微博里面的图片,下载下来
        for status in statuses {
            var downloadURLs = status.storePictureURLs
            // 如果原创没有,找转发的微博
            if downloadURLs == nil {
                downloadURLs = status.retweeted_status?.storePictureURLs
            }
            if downloadURLs == nil {
                // 说明原创没有图片,被转发的也没有图片
                continue
            }
            
            // 能到下面来说明有图片需要下载,不管微博模型里面有几张图片都缓存,会导致缓存图片时间太长了.
            // 只需要缓存一张图片,多张图片的不需要管,可要在cell即将显示的时候SDWebImage会自己去下载
            if downloadURLs?.count == 1 {
                let url = downloadURLs![0]
                
                // 在异步任务之前进入组
                group.enter()
                
                ImageDownloader.default.downloadImage(with: url, options: nil, progressBlock: nil, completionHandler: { (image, error, _, _) in
                    // 不管是下载成功还是失败,任务都完成了.就需要离开组
                    group.leave()
                    
                    if error != nil {
                        JPrint("SDWebImageManager下载图片失败: \(url)")
                        
                        return
                    }
                    
                    let data = UIImagePNGRepresentation(image!)!
                    length += CGFloat(data.count)
                })
            }
        }
        
        // 所有模型的图片都下载完成才通知
        group.notify(queue: DispatchQueue.main) { 
            // 所有图片都缓存完成,通知控制器来显示微博数据
            completion(statuses, nil)
        }
    }

}
